ã¿ã€ãã»ãŒããªæ§é åãã®ã³ã°ã®å©ç¹ããã®å®è£ ãããã³è€éãªãœãããŠã§ã¢ã·ã¹ãã ã«ããããããã°ãšç£èŠãã©ã®ããã«åŒ·åãããã説æããŸããããŸããŸãªèšèªãšãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠã¿ã€ãã»ãŒããªãã®ã³ã°ãå®è£ ããæ¹æ³ãåŠã³ãŸãã
ã¿ã€ãã»ãŒããªãã®ã³ã°ïŒãããã°ã匷åããããã®æ§é åãã®ã³ã°åå®è£
çŸä»£ã®ãœãããŠã§ã¢éçºã«ãããŠããã®ã³ã°ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãããã°ãç£èŠãããã³ç£æ»ã«äžå¯æ¬ ãªããŒã«ã§ããåŸæ¥ã®ãã®ã³ã°æ¹æ³ã§ã¯ãå€ãã®å Žåãéæ§é åããã¹ããå«ãŸãããããè§£æãåæãããã³æå³ã®ããæŽå¯ãåŸãããšãå°é£ã§ããæ§é åãã®ã³ã°ã¯ãäžè²«æ§ã®ããæ©æ¢°å¯èªãªåœ¢åŒãæäŸããããšã«ããããããã®å¶éã«å¯ŸåŠããŸããã¿ã€ãã»ãŒããªæ§é åãã®ã³ã°ã¯ããã°ã¡ãã»ãŒãžãäºåã«å®çŸ©ãããã¹ããŒããŸãã¯ããŒã¿åã«æºæ ããŠããããšãä¿èšŒããããšã§ãä¿¡é Œæ§ãé«ããå ç¢ãªåæã容æã«ããŸãã
æ§é åãã®ã³ã°ãšã¯ïŒ
æ§é åãã®ã³ã°ã§ã¯ããã°ã¡ãã»ãŒãžãæ§é åããŒã¿ãšããŠãã©ãŒãããããŸããéåžžãJSONãXMLããŸãã¯Protobufãªã©ã®åœ¢åŒã䜿çšããŸããåãã°ãšã³ããªã«ã¯ããŒãšå€ã®ãã¢ãå«ãŸããŠããããããã°ããŒã¿ãããã°ã©ã ã§ã¯ãšãªããã£ã«ã¿ãªã³ã°ãããã³åæããã®ãç°¡åã«ãªããŸããããã¯ãé¢é£æ å ±ãæœåºããããã«è§£æãå¿ èŠãªåŸæ¥ã®ããã¹ãããŒã¹ã®ãã®ã³ã°ãšã¯å¯Ÿç §çã§ãã
æ§é åãã®ã³ã°ã®å©ç¹
- å¯èªæ§ãšäžè²«æ§ã®åäžïŒæ§é åãã®ã³ã°ã«ããããã°ã¡ãã»ãŒãžãäžè²«ãã圢åŒã«ãªãã人éãšæ©æ¢°ã®äž¡æ¹ã«ãšã£ãŠèªã¿ãããçè§£ãããããªããŸãã
- ã¯ãšãªãšãã£ã«ã¿ãªã³ã°ã®åŒ·åïŒæ§é åããŒã¿ã䜿çšãããšããã°ããŒã¿ãå¹ççã«ã¯ãšãªããã³ãã£ã«ã¿ãªã³ã°ã§ãããããéçºè ã¯ç¹å®ââã®ã€ãã³ããŸãã¯åé¡ãè¿ éã«ç¹å®ã§ããŸãã
- å¹ççãªããŒã¿åæïŒæ§é åãã°ã¯ããŒã¿åæããŒã«ã«ç°¡åã«åã蟌ãããšãã§ããã¢ããªã±ãŒã·ã§ã³ã®åäœãšããã©ãŒãã³ã¹ã«é¢ãã貎éãªæŽå¯ãåŸãããŸãã
- èªåã¢ã©ãŒããšç£èŠïŒæ§é åãã°ããŒã¿ã䜿çšããŠãèªåã¢ã©ãŒããšç£èŠã·ã¹ãã ãèšå®ããåé¡ã®äºåç¹å®ãšè§£æ±ºãå¯èœã«ããŸãã
ã¿ã€ãã»ãŒããªãã®ã³ã°ãšã¯ïŒ
ã¿ã€ãã»ãŒããªãã®ã³ã°ã¯ãåãã§ãã¯ãçµã¿èŸŒãããšã«ãã£ãŠæ§é åãã®ã³ã°ãæ¡åŒµãããã°ã¡ãã»ãŒãžãäºåã«å®çŸ©ãããã¹ããŒããŸãã¯ããŒã¿åã«æºæ ããŠããããšãä¿èšŒããŸããããã¯ããã°ã¡ãã»ãŒãžå ã®åããŒã«ç¹å®ã®ããŒã¿åïŒæååãæŽæ°ãããŒã«å€ãªã©ïŒãããããšãæå³ããããã°ã©ãã³ã°èšèªãšãã®ã³ã°ãã¬ãŒã ã¯ãŒã¯ã«å¿ããŠãã³ã³ãã€ã«æãŸãã¯å®è¡æã«é©çšãããŸãã
ã¿ã€ãã»ãŒããªãã®ã³ã°ã®å©ç¹
- ãšã©ãŒã®åæžïŒåãã§ãã¯ã¯ãéçºããã»ã¹ã®æ©ã段éã§ãšã©ãŒããã£ããããã®ã«åœ¹ç«ã¡ã誀ã£ãããŸãã¯äžè²«æ§ã®ãªããã°ã¡ãã»ãŒãžãçæãããã®ãé²ããŸãã
- ããŒã¿å質ã®åäžïŒããŒã¿åã匷å¶ããããšã§ããã°ããŒã¿ãæ£ç¢ºã§ä¿¡é Œæ§ãé«ãããã°åæããåŸãããæŽå¯ã®å質ãåäžããŸãã
- ã³ãŒãã®ä¿å®æ§ã®åäžïŒã¿ã€ãã»ãŒããªãã®ã³ã°ã¯ããã°ã¡ãã»ãŒãžåœ¢åŒã®æç¢ºãªã³ã³ãã©ã¯ããæäŸããããšã«ãããã³ãŒãã®ä¿å®æ§ãé«ããç Žå£çãªå€æŽã®ãªã¹ã¯ã軜æžããŸãã
- ç£èŠããŒã«ãšã®ããè¯ãçµ±åïŒäžè²«ããããŒã¿åã¯ãç£èŠããã³åæããŒã«ãšã®ã·ãŒã ã¬ã¹ãªçµ±åãä¿é²ããããé«åºŠãªç£èŠããã³ã¢ã©ãŒãæ©èœãå¯èœã«ããŸãã
ã¿ã€ãã»ãŒããªãã®ã³ã°ã®å®è£
ã¿ã€ãã»ãŒããªãã®ã³ã°ãå®è£ ããã«ã¯ãããã°ã©ãã³ã°èšèªããã®ã³ã°ãã¬ãŒã ã¯ãŒã¯ãããã³ããŒã¿ã·ãªã¢ã«å圢åŒãæ éã«æ€èšããå¿ èŠããããŸããããŸããŸãªèšèªã§ã¿ã€ãã»ãŒããªãã®ã³ã°ãå®è£ ããããã®ããã€ãã®ã¢ãããŒããæ¬¡ã«ç€ºããŸãã
1. TypeScript
TypeScriptã¯ã匷åãªåã·ã¹ãã ãåããŠãããã¿ã€ãã»ãŒããªãã®ã³ã°ã®å®è£ ã«é©ããŠããŸãããã°ã¡ãã»ãŒãžã®ã€ã³ã¿ãŒãã§ãŒã¹ãŸãã¯åãå®çŸ©ããããšã«ããããã¹ãŠã®ãã°ãšã³ããªãäºåã«å®çŸ©ãããã¹ããŒãã«æºæ ããããã«ããããšãã§ããŸãã
äŸïŒ
interface LogMessage {
level: 'info' | 'warn' | 'error';
message: string;
timestamp: Date;
context?: {
[key: string]: any;
};
}
function log(message: LogMessage) {
console.log(JSON.stringify(message));
}
// Example usage
log({
level: 'info',
message: 'User logged in',
timestamp: new Date(),
context: {
userId: 123,
username: 'john.doe'
}
});
ãã®äŸã§ã¯ãLogMessageã€ã³ã¿ãŒãã§ãŒã¹ã¯ããã°ã¬ãã«ãã¡ãã»ãŒãžãã¿ã€ã ã¹ã¿ã³ããããã³ãªãã·ã§ã³ã®ã³ã³ããã¹ããå«ãããã°ã¡ãã»ãŒãžã®æ§é ãå®çŸ©ããŸããlog颿°ã¯ããã®æ§é ã匷å¶ããæå¹ãªãã°ã¡ãã»ãŒãžã®ã¿ãçæãããããã«ããŸãã
2. Type HintsãšPydanticã䜿çšããPython
Pythonã¯ãåãã³ããšPydanticã®ãããªã©ã€ãã©ãªã®å°å ¥ã«ãããã¿ã€ãã»ãŒããªãã®ã³ã°ããµããŒãã§ããŸããPydanticã䜿çšãããšãåã¢ãããŒã·ã§ã³ã䜿çšããŠããŒã¿ã¢ãã«ãå®çŸ©ã§ããŸããããã¯ããã°ã¡ãã»ãŒãžã®æ€èšŒã«äœ¿çšã§ããŸãã
äŸïŒ
from typing import Literal, Dict, Any
from datetime import datetime
from pydantic import BaseModel
class LogMessage(BaseModel):
level: Literal['info', 'warn', 'error']
message: str
timestamp: datetime
context: Dict[str, Any] = {}
def log(message: LogMessage):
print(message.json())
# Example usage
log(LogMessage(
level='info',
message='User logged in',
timestamp=datetime.now(),
context={'userId': 123, 'username': 'john.doe'}
))
ãã®äŸã§ã¯ãLogMessageã¯ã©ã¹ã¯Pydanticã®BaseModelã䜿çšããŠå®çŸ©ãããŠããŸããããã«ããããã°ã¡ãã»ãŒãžã®æ§é ãšåã匷å¶ãããjson()ã¡ãœããã¯ã¡ãã»ãŒãžãJSONã«ã·ãªã¢ã«åããããã®äŸ¿å©ãªæ¹æ³ãæäŸããŸãã
3. SLF4Jãšã«ã¹ã¿ã ãã¬ãŒã䜿çšããJava
Javaã§ã¯ãSLF4JïŒJavaçšã®Simple Logging FacadeïŒãšãã°ã¡ãã»ãŒãžçšã®ã«ã¹ã¿ã ããŒã¿ã¯ã©ã¹ãçµã¿åãããŠãã¿ã€ãã»ãŒããªãã®ã³ã°ãå®è£ ã§ããŸããæ§é åããããã°ã€ãã³ãã衚ãã¯ã©ã¹ãå®çŸ©ããã¢ããªã±ãŒã·ã§ã³å šäœã§äœ¿çšããŸãã
äŸïŒ
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.time.Instant;
import java.util.Map;
public class LogMessage {
private String level;
private String message;
private Instant timestamp;
private Map<String, Object> context;
public LogMessage(String level, String message, Instant timestamp, Map<String, Object> context) {
this.level = level;
this.message = message;
this.timestamp = timestamp;
this.context = context;
}
// Getters
public String getLevel() { return level; }
public String getMessage() { return message; }
public Instant getTimestamp() { return timestamp; }
public Map<String, Object> getContext() { return context; }
@Override
public String toString() {
return String.format("{\"level\":\"%s\", \"message\":\"%s\", \"timestamp\":\"%s\", \"context\":%s}", level, message, timestamp, context);
}
}
public class CustomLogger {
private static final Logger logger = LoggerFactory.getLogger(CustomLogger.class);
public static void log(LogMessage message) {
logger.info(message.toString());
}
public static void main(String[] args) {
LogMessage logMessage = new LogMessage("info", "User logged in", Instant.now(), Map.of("userId", 123, "username", "john.doe"));
log(logMessage);
}
}
ããã§ã¯ãLogMessageã¯ã©ã¹ã¯ãã°ã€ãã³ãã®æ§é ãå®çŸ©ããŸããCustomLoggerã¯ãSLF4Jã䜿çšããŠLogMessageã®æåå衚çŸããã°ã«èšé²ããŸãã
4. StructsãšLogrus/Zapã䜿çšããGo
Goã®åŒ·åãªåã·ã¹ãã ã¯ãã¿ã€ãã»ãŒããªãã®ã³ã°ã«èªç¶ã«é©ããŠããŸããæ§é äœãå®çŸ©ããŠãã°ã¡ãã»ãŒãžã衚ããLogrusãZapã®ãããªãã®ã³ã°ã©ã€ãã©ãªã䜿çšããŠããããã®æ§é äœãæ§é åããŒã¿ãšããŠãã°ã«èšé²ã§ããŸãã
äŸïŒ
package main
import (
"encoding/json"
"log"
"time"
)
type LogMessage struct {
Level string `json:"level"`
Message string `json:"message"`
Timestamp time.Time `json:"timestamp"`
Context map[string]interface{} `json:"context,omitempty"`
}
func Log(message LogMessage) {
b, err := json.Marshal(message)
if err != nil {
log.Printf("Error marshaling log message: %v", err)
return
}
log.Println(string(b))
}
func main() {
message := LogMessage{
Level: "info",
Message: "User logged in",
Timestamp: time.Now(),
Context: map[string]interface{}{`userId`: 123, `username`: `john.doe`},
}
Log(message)
}
ãã®äŸã§ã¯ãLogMessageæ§é äœã¯ãã°ã¡ãã»ãŒãžã®æ§é ãå®çŸ©ããŸããjsonã¿ã°ã䜿çšãããšãã¡ãã»ãŒãžãJSON圢åŒã«ç°¡åã«ããŒã·ã£ãªã³ã°ã§ããŸãã
ãã®ã³ã°ãã¬ãŒã ã¯ãŒã¯ã®éžæ
ã¿ã€ãã»ãŒããªãã®ã³ã°ã广çã«å®è£ ããã«ã¯ãé©åãªãã®ã³ã°ãã¬ãŒã ã¯ãŒã¯ãéžæããããšãéèŠã§ãããã®ã³ã°ãã¬ãŒã ã¯ãŒã¯ãéžæããéã¯ã次ã®èŠçŽ ãèæ ®ããŠãã ããã
- èšèªãµããŒãïŒãã¬ãŒã ã¯ãŒã¯ãããã°ã©ãã³ã°èšèªãšãšã³ã·ã¹ãã ããµããŒãããŠããããšã確èªããŠãã ããã
- æ§é åãã®ã³ã°æ©èœïŒããŒãšå€ã®ãã¢ã®ãã°èšé²ãããã°ã¡ãã»ãŒãžãJSONã«ã·ãªã¢ã«åããæ©èœãªã©ãæ§é åãã®ã³ã°ã®çµã¿èŸŒã¿ãµããŒããæäŸãããã¬ãŒã ã¯ãŒã¯ãæ¢ããŠãã ããã
- æ¡åŒµæ§ïŒã«ã¹ã¿ã ãã°åœ¢åŒã®è¿œå ããå€éšç£èŠããŒã«ãšã®çµ±åãªã©ããã®æ©èœãæ¡åŒµã§ãããã¬ãŒã ã¯ãŒã¯ãéžæããŠãã ããã
- ããã©ãŒãã³ã¹ïŒãã®ã³ã°ãã¬ãŒã ã¯ãŒã¯ãã¢ããªã±ãŒã·ã§ã³ã«äžããããã©ãŒãã³ã¹ãžã®åœ±é¿ãèæ ®ããŠãã ãããäžéšã®ãã¬ãŒã ã¯ãŒã¯ã§ã¯ãç¹ã«å€§éã®ããŒã¿ããã°ã«èšé²ããå Žåã倧ããªãªãŒããŒããããçºçããå¯èœæ§ããããŸãã
- ã³ãã¥ããã£ãšãµããŒãïŒã¢ã¯ãã£ããªã³ãã¥ããã£ãšåªãããµããŒããåãããã¬ãŒã ã¯ãŒã¯ãéžæããŠãåé¡ãçºçããå Žåã«æ¯æŽãåããããšãã§ããããã«ããŸãã
ã¿ã€ãã»ãŒããªãã®ã³ã°ã®ãã¹ããã©ã¯ãã£ã¹
ã¿ã€ãã»ãŒããªãã®ã³ã°ã®å©ç¹ãæå€§éã«æŽ»çšããã«ã¯ã次ã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ããã
- æç¢ºãªã¹ããŒãã®å®çŸ©ïŒåãã°ãšã³ããªã®ããŒã¿åãšæ§é ãæå®ããŠããã°ã¡ãã»ãŒãžã®æç¢ºã§äžè²«æ§ã®ããã¹ããŒããå®çŸ©ããŸãã
- æå³ã®ããããŒã®äœ¿çšïŒãã°ãã£ãŒã«ãã«ã¯ãæå³ã®ããèšè¿°çãªããŒã䜿çšããŸããããã«ããããã°ããŒã¿ãçè§£ããã³åæãããããªããŸãã
- é©åãªã¬ãã«ã§ã®ãã°èšé²ïŒãã°ã¡ãã»ãŒãžã®é倧床ã瀺ãããã«ãããŸããŸãªãã°ã¬ãã«ïŒinfoãwarnãerrorãªã©ïŒã䜿çšããŸãã
- ã³ã³ããã¹ãæ å ±ã®å«ããïŒãããã°ãšãã©ãã«ã·ã¥ãŒãã£ã³ã°ã容æã«ããããã«ããŠãŒã¶ãŒIDããã©ã³ã¶ã¯ã·ã§ã³IDããŸãã¯ãªã¯ãšã¹ãIDãªã©ã®ã³ã³ããã¹ãæ å ±ããã°ã¡ãã»ãŒãžã«å«ããŸãã
- æ©å¯ããŒã¿ã®ãµãã¿ã€ãºïŒãŠãŒã¶ãŒã®ãã©ã€ãã·ãŒãä¿è·ããããŒã¿ä¿è·èŠå¶ãéµå®ããããã«ããã¹ã¯ãŒããã¯ã¬ãžããã«ãŒãçªå·ãªã©ããã°ã«èšé²ããåã«æ©å¯ããŒã¿ããµãã¿ã€ãºããŸããããã·ã¥ãŸãã¯æå·åææ³ã䜿çšããŠãæ©å¯ããŒã¿ããã¹ã¯ããããšãæ€èšããŠãã ããã
- ãã°ããªã¥ãŒã ã®ç£èŠïŒãã°ããŒã¿ã®çæéãç£èŠããŠãéå°ãªãã®ã³ã°ãããã©ãŒãã³ã¹ã®ããã«ããã¯ãªã©ãæœåšçãªåé¡ãç¹å®ããŸãã
- ãã°åæã®èªååïŒELKã¹ã¿ãã¯ïŒElasticsearchãLogstashãKibanaïŒãSplunkããŸãã¯Grafanaãªã©ã®ããŒã«ã䜿çšããŠãã°åæãèªååããã¢ããªã±ãŒã·ã§ã³ã®åäœãšããã©ãŒãã³ã¹ã«é¢ããæŽå¯ãåŸãŸãã
ãã®ã³ã°ã«é¢ããã°ããŒãã«ãªèæ ®äºé
ã°ããŒãã«ãªã³ã³ããã¹ãã§ãã®ã³ã°ãå®è£ ããå Žåã¯ã次ã®ç¹ãèæ ®ããããšãéèŠã§ãã
- ã¿ã€ã ãŸãŒã³ïŒç°ãªãå°åããã®ãã°ããŒã¿ãåæããéã®æ··ä¹±ãé¿ããããã«ãã¿ã€ã ã¹ã¿ã³ããäžè²«ããã¿ã€ã ãŸãŒã³ïŒUTCãªã©ïŒã§èšé²ãããŠããããšã確èªããŠãã ããã
- ããŒã«ãªãŒãŒã·ã§ã³ïŒããŸããŸãªèšèªã®ãŠãŒã¶ãŒããµããŒãããããã«ããã°ã¡ãã»ãŒãžã®ããŒã«ãªãŒãŒã·ã§ã³ãæ€èšããŠãã ãããããã«ã¯ããã°ã¡ãã»ãŒãžã®ç¿»èš³ããæ¥ä»ãšæ°å€ã®ä»£æ¿åœ¢åŒã®æäŸãå«ãŸããå ŽåããããŸãã
- ããŒã¿ãã©ã€ãã·ãŒïŒãšãŒãããã®GDPRãã«ãªãã©ã«ãã¢ã®CCPAãªã©ãããŸããŸãªåœã®ããŒã¿ãã©ã€ãã·ãŒèŠå¶ãéµå®ããŠãã ãããé©åãªåæã¡ã«ããºã ãæŽåãããŠãããå人ããŒã¿ãå®å šã«åŠçãããŠããããšã確èªããŠãã ããã
- ããŒã¿ä¿æïŒããŸããŸãªæ³åã®æ³çèŠä»¶ããã³èŠå¶èŠä»¶ã«æºæ ããããŒã¿ä¿æããªã·ãŒãå®çŸ©ããŸãããã°ããŒã¿ãå¿ èŠä»¥äžã«é·ãä¿æãããŠããªãããšã確èªããŠãã ããã
- ã»ãã¥ãªãã£ïŒãã°ããŒã¿ãäžæ£ã¢ã¯ã»ã¹ãŸãã¯å€æŽããä¿è·ããããã«ãé©åãªã»ãã¥ãªãã£å¯Ÿçãå®è£ ããŸããããã«ã¯ããã°ããŒã¿ã®æå·åãã¢ã¯ã»ã¹å¶åŸ¡ã®å®è£ ããŸãã¯å®å šãªãã®ã³ã°ãããã³ã«ã®äœ¿çšãå«ãŸããå ŽåããããŸãã
çµè«
ã¿ã€ãã»ãŒããªæ§é åãã®ã³ã°ã¯ãè€éãªãœãããŠã§ã¢ã·ã¹ãã ã«ããããããã°ãç£èŠãããã³ç£æ»ã匷åããããã®åŒ·åãªææ³ã§ããããŒã¿åãšã¹ããŒãã匷å¶ããããšã«ããããšã©ãŒãæžãããããŒã¿å質ãåäžãããç£èŠããŒã«ãšã®ã·ãŒã ã¬ã¹ãªçµ±åãä¿é²ããŸããã¿ã€ãã»ãŒããªãã®ã³ã°ãã©ã¯ãã£ã¹ãå®è£ ããé©åãªãã®ã³ã°ãã¬ãŒã ã¯ãŒã¯ãéžæããããšã§ãéçºè ã¯ã¢ããªã±ãŒã·ã§ã³ã®åäœãšããã©ãŒãã³ã¹ã«é¢ãã貎éãªæŽå¯ãåŸãããšãã§ããããä¿¡é Œæ§ãé«ããä¿å®ãããããœãããŠã§ã¢ã«ã€ãªãããŸãã
ãœãããŠã§ã¢ã·ã¹ãã ãããè€éã«ãªãã忣ãããã«ã€ããŠã广çãªãã®ã³ã°ã®éèŠæ§ã¯å¢ãã°ããã§ããã¿ã€ãã»ãŒããªæ§é åãã®ã³ã°ãžã®æè³ã¯ãããŒã¿å質ãã³ãŒãä¿å®æ§ãããã³ããã¢ã¯ãã£ããªç£èŠãéèŠããçµç¹ã«ãšã£ãŠäŸ¡å€ã®ããåãçµã¿ã§ãã